home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / DIAGXPRT.PAK / TOOLHELP.CPP < prev   
C/C++ Source or Header  |  1997-05-06  |  6KB  |  202 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // (C) Copyright 1995, 1995 by Borland International, All Rights Reserved
  4. //
  5. //----------------------------------------------------------------------------
  6. #include <owl/pch.h>
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include "diagxprt.h"
  10. #include <toolhelp.h>
  11.  
  12. char  TToolHelp::buffer[1024];
  13. struct  TToolHelp::ERRMAP TToolHelp::errmap[] = {
  14. #if defined(BI_PLAT_WIN16)
  15.   { ERR_GALLOC,     "GlobalAlloc failed" },
  16.   { ERR_GREALLOC,   "GlobalReAlloc failed" },
  17.   { ERR_GLOCK,      "GlobalLock failed" },
  18.   { ERR_LALLOC,     "LocalAlloc failed" },
  19.   { ERR_LREALLOC,   "LocalReAlloc failed" },
  20.   { ERR_LLOCK,      "LocalLock failed" },
  21. #endif
  22.   { ERR_ALLOCRES,   "AllocResource failed" },
  23.   { ERR_LOCKRES,    "LockResource failed" },
  24.   { ERR_LOADMODULE, "LoadModule failed" },
  25.  
  26.   { ERR_CREATEDLG,  "CreateDialog() failed: Couldn't load menu or create window" },
  27.   { ERR_CREATEDLG2, "CreateDialog() failed: Couldn't create window" },
  28.   { ERR_REGISTERCLASS, "RegisterClass failed: Class already exists" },
  29.   { ERR_DCBUSY,     "DC Cache full: Too many GetDC() calls" },
  30.   { ERR_CREATEWND,  "CreateWindow failed: Window class not found" },
  31.   { ERR_STRUCEXTRA, "Unallocated extra window/class word index used" },
  32.   { ERR_LOADSTR,    "LoadString() failed" },
  33.   { ERR_LOADMENU,   "LoadMenu() failed" },
  34.   { ERR_NESTEDBEGINPAINT, "Nested BeginPaint() calls" },
  35.   { ERR_BADINDEX,   "Invalid window word index value" },
  36.   { ERR_CREATEMENU, "CreateMenu failed" },
  37.  
  38.   { ERR_CREATEDC,   "CreateDC failed" },
  39.   { ERR_CREATEMETA, "CreateMetafile: Can't create metafile" },
  40.   { ERR_SELBITMAP,  "Bitmap already selected" },
  41.   { ERR_DELOBJSELECTED, "Selected object deleted" },
  42.   { 0, 0 }
  43. };
  44.  
  45. char*
  46. TToolHelp::GetTaskName()
  47. {
  48.   HTASK hTask = GetCurrentTask();
  49.   TASKENTRY te;
  50.   te.dwSize = sizeof(te);
  51.   TaskName[0]=0;
  52.   if (TaskFindHandle(&te, hTask))
  53.     strcpy(TaskName,(LPSTR)te.szModule);
  54.   return TaskName;
  55. }
  56.  
  57. char*
  58. TToolHelp::GetProcName(FARPROC lpfn)
  59. {
  60.   GLOBALENTRY ge;
  61.   MODULEENTRY me;
  62.   ge.dwSize = sizeof(ge);
  63.   me.dwSize = sizeof(me);
  64.   ProcName[0]=0;
  65.   if (GlobalEntryHandle(&ge, (HGLOBAL)HIWORD(lpfn)) &&
  66.                         ge.wType == GT_CODE &&
  67.                         ModuleFindHandle(&me, (HMODULE)ge.hOwner)) {
  68.     strcpy(ProcName,(LPSTR)me.szModule);
  69.   }
  70.   return ProcName;
  71. }
  72.  
  73.  
  74. // Table of LogParamErrors
  75. //
  76. struct LogParamError
  77. {
  78.   unsigned err;   // Error code
  79.   char*    type;
  80.   unsigned fmt;  // Format hints for specific error
  81. };
  82.  
  83. struct LogParamError logParamErrors[] =
  84. {
  85.   {ERR_BAD_VALUE,        "value",        1},
  86.   {ERR_BAD_INDEX,        "index",        1},
  87.   {ERR_BAD_FLAGS,        "flags",        2},
  88.   {ERR_BAD_SELECTOR,     "selector",     2},
  89.   {ERR_BAD_DFLAGS,       "flags",        3},
  90.   {ERR_BAD_DVALUE,       "value",        3},
  91.   {ERR_BAD_DINDEX,       "index",        3},
  92.   {ERR_BAD_PTR,          "pointer",      4},
  93.   {ERR_BAD_FUNC_PTR,     "function pointer", 4},
  94.   {ERR_BAD_STRING_PTR,   "string pointer", 4},
  95.   {ERR_BAD_HINSTANCE,    "HINSTANCE",    2},
  96.   {ERR_BAD_HMODULE,      "HMODULE",      2},
  97.   {ERR_BAD_GLOBAL_HANDLE,"global handle", 2},
  98.   {ERR_BAD_LOCAL_HANDLE, "local handle", 2},
  99.   {ERR_BAD_ATOM,         "atom",         2},
  100.   {ERR_BAD_HWND,         "HWND",         2},
  101.   {ERR_BAD_HMENU,        "HMENU",        2},
  102.   {ERR_BAD_HCURSOR,      "HCURSOR",      2},
  103.   {ERR_BAD_HICON,        "HICON",        2},
  104.   {ERR_BAD_GDI_OBJECT,   "HGDIOBJ",      2},
  105.   {ERR_BAD_HDC,          "HDC",          2},
  106.   {ERR_BAD_HPEN,         "HPEN",         2},
  107.   {ERR_BAD_HFONT,        "HFONT",        2},
  108.   {ERR_BAD_HBRUSH,       "HBRUSH",       2},
  109.   {ERR_BAD_HBITMAP,      "HBITMAP",      2},
  110.   {ERR_BAD_HRGN,         "HRGN",         2},
  111.   {ERR_BAD_HPALETTE,     "HPALETTE",     2},
  112.   {ERR_BAD_HANDLE,       "HANDLE",       2},
  113.   {ERR_BAD_HFILE,        "HFILE",        2},
  114.   {ERR_BAD_HMETAFILE,    "HMETAFILE",    2},
  115.   {ERR_BAD_CID,          "CID",          2},
  116.   {ERR_BAD_HDRVR,        "HDRVR",        2},
  117.   {ERR_BAD_HDWP,         "HDWP",         2}
  118. };
  119.  
  120.  
  121. void
  122. TToolHelp::FormatLogParamError(char *result, int size, TDispData *d)
  123. {
  124.   char *type = "parameter";
  125.   unsigned fmt = 0;
  126.   char *warning;
  127.   unsigned err = d->ErrorCode & ~ERR_WARNING;
  128.  
  129.   // Look through table of errors until we find one that matches
  130.   //
  131.   for (int i = 0; i < (sizeof(logParamErrors) / sizeof(struct LogParamError)); i++) {
  132.     if (logParamErrors[i].err == err) {
  133.       fmt = logParamErrors[i].fmt;
  134.       type = logParamErrors[i].type;
  135.       break;
  136.     }
  137.   }
  138.   if (d->ErrorCode & ERR_WARNING)
  139.     warning = "Warning:";
  140.   else
  141.     warning = "Error:";
  142.  
  143.   if (fmt == 4)
  144.     sprintf(buffer,"%s %s %s: Invalid %s: %#04x:%#04x \r\n",warning,
  145.       d->ModuleName,d->ProcName,type,SELECTOROF(d->Param),OFFSETOF(d->Param));
  146.  
  147.   else if (fmt == 3)
  148.     sprintf(buffer,"%s %s %s: Invalid %s: %#04x%#04x \r\n",warning,
  149.       d->ModuleName,d->ProcName,type,(DWORD)d->Param);
  150.  
  151.   else
  152.     sprintf(buffer,"%s %s %s: Invalid %s: %#04x\r\n",warning,
  153.       d->ModuleName,d->ProcName,type,(WORD)(DWORD)d->Param);
  154.  
  155.   strncpy(result, buffer, size - 1);
  156.   buffer[size - 1] = 0;
  157. }
  158.  
  159.  
  160. #define ERR_SIZEMASK   (ERR_BYTE | ERR_WORD | ERR_DWORD)
  161.  
  162. void
  163. TToolHelp::FormatLogError(char* result, int size, TDispData* d)
  164. {
  165.   char* p = buffer;
  166.   char* errStr = "";
  167.  
  168.   uint err = (d->ErrorCode & ~(ERR_WARNING | ERR_SIZEMASK));
  169.  
  170.   for (int i = 0; errmap[i].szErr; i++) {
  171.     if (errmap[i].err == err) {
  172.       errStr = errmap[i].szErr;
  173.       break;
  174.     }
  175.   }
  176.  
  177.   if (d->ErrorCode & ERR_WARNING) {
  178.     sprintf(p, "%s: Warning %x: %s",
  179.       (LPSTR)d->ModuleName, d->ErrorCode, (LPSTR)errStr);
  180.   } else {
  181.     sprintf(p, "%s: Error %x: %s",
  182.       (LPSTR)d->ModuleName, d->ErrorCode, (LPSTR)errStr);
  183.   }
  184.  
  185.   p += strlen(p);
  186.   switch (d->ErrorCode & ERR_SIZEMASK) {
  187.     case ERR_BYTE:
  188.       sprintf(p, "%x\r\n", LOBYTE(LOWORD(d->Data)));
  189.       break;
  190.     case ERR_WORD:
  191.       sprintf(p, "%x\r\n", LOWORD(d->Data));
  192.       break;
  193.     case ERR_DWORD:
  194.       sprintf(p, "%x%x\r\n", HIWORD(d->Data), LOWORD(d->Data));
  195.       break;
  196.     default:
  197.       sprintf(p, "\r\n");
  198.   }
  199.   strncpy(result, buffer, size - 1);
  200.   buffer[size - 1] = 0;
  201. }
  202.